package com.zhuhao.export.exportfreemarker;

import com.zhuhao.basic.collection.domain.User;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.springframework.util.ResourceUtils;

import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description 利用FreeMarker导出Word
 * 2018年12月15日  下午10:23:40
 * @Author Huang Xiaocong
 */
public class ExportMyWord {

    private Configuration config = null;

    public ExportMyWord() {
        config = new Configuration(Configuration.VERSION_2_3_28);
        config.setDefaultEncoding("utf-8");
    }

    public static void main(String[] args) throws IOException, TemplateException {
        ExportMyWord exportMyWord = new ExportMyWord();
        HashMap<String, Object> dataMap = new HashMap<>();
        dataMap.put("userName", "xiaoming");
        dataMap.put("age", 18);
        dataMap.put("userList", Arrays.asList(new User("xiaohong", 18, 20D), new User("honghong", 20, 30D)));

        exportMyWord.createWord(dataMap, "test.ftl", getResourceBasePath() + "test.doc");
    }

    /**
     * FreeMarker生成Word
     *
     * @param dataMap      数据
     * @param templateName 目标名
     * @param saveFilePath 保存文件路径的全路径名（路径+文件名）
     * @Author Huang Xiaocong 2018年12月15日 下午10:19:03
     */
    public void createWord(Map<String, Object> dataMap, String templateName, String saveFilePath) throws IOException, TemplateException {
        //加载模板(路径)数据
        config.setDirectoryForTemplateLoading(new File(this.getClass().getClassLoader().getResource("").getPath()));
        //设置异常处理器 这样的话 即使没有属性也不会出错 如：${list.name}...不会报错
        config.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
        Template template = config.getTemplate(templateName);

        File outFile = new File(saveFilePath);
        if (!outFile.getParentFile().exists()) {
            outFile.getParentFile().mkdirs();
        }
        FileOutputStream fos = new FileOutputStream(outFile);
        Writer out = new BufferedWriter(new OutputStreamWriter(fos));
        //将模板中的预先的代码替换为数据
        template.process(dataMap, out);

        System.out.println("由模板文件：" + templateName + ".ftl" + " 生成文件 ：" + saveFilePath + " 成功！！");
        out.close();//web项目不可关闭
    }

    /**
     * 获取项目根路径
     *
     * @return
     */
    private static String getResourceBasePath() {
        // 获取跟目录
        File path = null;
        try {
            path = new File(ResourceUtils.getURL("classpath:").getPath());
        } catch (FileNotFoundException e) {
            // nothing to do
        }
        if (path == null || !path.exists()) {
            path = new File("");
        }

        String absolutePath = path.getAbsolutePath() + "\\";
        return absolutePath;
    }
}
